#!/usr/bin/python3
# -*- coding:utf-8 -*-
# FTP服务的主动模式和被动模式
# 主动模式工作过程：
# 1. 客户端以随机非特权端口N，就是大于1024的端口，对server端21端口发起连接
# 2. 客户端开始监听 N+1端口；
# 3. 服务端会主动以20端口连接到客户端的N+1端口。

# 主动模式的优点：
# 服务端配置简单，利于服务器安全管理，服务器只需要开放21端口
# 主动模式的缺点：
# 如果客户端开启了防火墙，或客户端处于内网（NAT网关之后），那么服务器对客户端端口发起的连接可能会失败

# 被动模式工作过程：
# 1. 客户端以随机非特权端口连接服务端的21端口
# 2. 服务端开启一个非特权端口为被动端口，并返回给客户端
# 3. 客户端以非特权端口+1的端口主动连接服务端的被动端口

# 被动模式缺点：
# 服务器配置管理稍显复杂，不利于安全，服务器需要开放随机高位端口以便客户端可以连接，因此大多数FTP服务软件都可以手动配置被动端口的范围
# 被动模式的优点：
# 对客户端网络环境没有要求

# 读权限 ：
    # e	改变文件目录
    # l	列出文件
    # r	从服务器接收文件
# 写权限 ：
    # a	文件上传
    # d	删除文件
    # f	文件重命名
    # m	创建文件
    # w	写权限
    # M	文件传输模式（通过FTP设置文件权限）

# 简单的ftp本地验证 https://www.cnblogs.com/huangxm/p/6274645.html
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

#实例化虚拟用户，这是FTP验证首要条件
authorizer = DummyAuthorizer()

#添加用户权限和路径，括号内的参数是(用户名， 密码， 用户目录， 权限)
authorizer.add_user('user', '12345', 'C:\\Users\\vainuer\\Desktop\\Test\\FtpServer', perm='elradfmw')

#添加匿名用户 只需要路径
authorizer.add_anonymous('C:\\Users\\vainuer\\Desktop\\Test\\FtpServer')

#初始化ftp句柄
handler = FTPHandler
handler.authorizer = authorizer

#添加被动端口范围
handler.passive_ports = range(2000, 2333)

#监听ip 和 端口,因为linux里非root用户无法使用21端口，所以我使用了2121端口
server = FTPServer(('127.0.0.1', 2121), handler)

#开始服务
server.serve_forever()